/**
 * 日期时间工具函数
 */

/**
 * 格式化时间
 * @param {string|Date} time 时间
 * @param {string} format 格式
 * @returns {string} 格式化后的时间
 */
export function formatTime(time, format = 'auto') {
  if (!time) return ''
  
  const date = new Date(time)
  const now = new Date()
  const diff = now.getTime() - date.getTime()
  
  // 自动格式化
  if (format === 'auto') {
    // 1分钟内
    if (diff < 60 * 1000) {
      return '刚刚'
    }
    
    // 1小时内
    if (diff < 60 * 60 * 1000) {
      return `${Math.floor(diff / (60 * 1000))}分钟前`
    }
    
    // 今天
    if (isSameDay(date, now)) {
      return formatDate(date, 'HH:mm')
    }
    
    // 昨天
    const yesterday = new Date(now.getTime() - 24 * 60 * 60 * 1000)
    if (isSameDay(date, yesterday)) {
      return `昨天 ${formatDate(date, 'HH:mm')}`
    }
    
    // 今年
    if (date.getFullYear() === now.getFullYear()) {
      return formatDate(date, 'MM-dd HH:mm')
    }
    
    // 其他
    return formatDate(date, 'yyyy-MM-dd HH:mm')
  }
  
  return formatDate(date, format)
}

/**
 * 格式化日期
 * @param {Date} date 日期对象
 * @param {string} format 格式字符串
 * @returns {string} 格式化后的日期
 */
export function formatDate(date, format) {
  const year = date.getFullYear()
  const month = date.getMonth() + 1
  const day = date.getDate()
  const hour = date.getHours()
  const minute = date.getMinutes()
  const second = date.getSeconds()
  
  const formatMap = {
    'yyyy': year,
    'MM': padZero(month),
    'dd': padZero(day),
    'HH': padZero(hour),
    'mm': padZero(minute),
    'ss': padZero(second)
  }
  
  let result = format
  Object.keys(formatMap).forEach(key => {
    result = result.replace(key, formatMap[key])
  })
  
  return result
}

/**
 * 判断是否为同一天
 * @param {Date} date1 日期1
 * @param {Date} date2 日期2
 * @returns {boolean} 是否为同一天
 */
export function isSameDay(date1, date2) {
  return date1.getFullYear() === date2.getFullYear() &&
         date1.getMonth() === date2.getMonth() &&
         date1.getDate() === date2.getDate()
}

/**
 * 补零
 * @param {number} num 数字
 * @returns {string} 补零后的字符串
 */
function padZero(num) {
  return num < 10 ? `0${num}` : num.toString()
}

/**
 * 获取相对时间
 * @param {string|Date} time 时间
 * @returns {string} 相对时间描述
 */
export function getRelativeTime(time) {
  if (!time) return ''
  
  const date = new Date(time)
  const now = new Date()
  const diff = now.getTime() - date.getTime()
  
  const minute = 60 * 1000
  const hour = 60 * minute
  const day = 24 * hour
  const week = 7 * day
  const month = 30 * day
  const year = 365 * day
  
  if (diff < minute) {
    return '刚刚'
  } else if (diff < hour) {
    return `${Math.floor(diff / minute)}分钟前`
  } else if (diff < day) {
    return `${Math.floor(diff / hour)}小时前`
  } else if (diff < week) {
    return `${Math.floor(diff / day)}天前`
  } else if (diff < month) {
    return `${Math.floor(diff / week)}周前`
  } else if (diff < year) {
    return `${Math.floor(diff / month)}个月前`
  } else {
    return `${Math.floor(diff / year)}年前`
  }
}
